home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 May: Tool Chest / Developer CD Series May 1996 (Tool Chest) (Apple Computer) (1996).iso / Sample Code / Snippets / Sound / 2BufRecordSndPlay / 2BufRecordSndPlay.c next >
Encoding:
C/C++ Source or Header  |  1995-02-11  |  3.7 KB  |  169 lines  |  [TEXT/MPS ]

  1. #include    <Quickdraw.h>
  2. #include    <Windows.h>
  3. #include    <dialogs.h>
  4. #include    <OSEvents.h>
  5. #include    <Memory.h>
  6. #include    <Packages.h>
  7. #include    <Sound.h>
  8. #include    <SoundInput.h>
  9. #include    <OSUtils.h>
  10.  
  11. #define    TRUE            0xFF
  12. #define    FALSE            0
  13. #define buffSize        0x10000
  14.  
  15. typedef struct {
  16.     short        OnOff;
  17.     short         Level;
  18. } Level;
  19.  
  20.  
  21. pascal void MyRecComp (SPBPtr inParamPtr);
  22.  
  23. #ifdef powerc
  24.    QDGlobals    qd;
  25. #endif
  26.  
  27. main()
  28. {
  29.     OSErr                err;
  30.     SPBPtr                RecordRec;
  31.     long                SoundRefNum;
  32.     Handle                Buffer, Buffer2;
  33.     SndChannelPtr        chan;
  34.     Level                myLevel;
  35.     short                headerlength, headerlength2, dummy;
  36.     Fixed                sampleRate;
  37.     SICompletionUPP     mySICompletionUPP;
  38.     
  39.     InitGraf(&qd.thePort);
  40.     FlushEvents(everyEvent, 0);
  41.     InitWindows();
  42.     InitDialogs(nil);
  43.     InitCursor();
  44.     
  45.     err = SPBOpenDevice (nil, siWritePermission, &SoundRefNum);
  46.     if (err != noErr)
  47.         Debugger();
  48.         
  49.     myLevel.OnOff = 0;
  50.     myLevel.Level = 0;
  51.     err = SPBSetDeviceInfo (SoundRefNum,siPlayThruOnOff, (Ptr) &myLevel);
  52.     if (err != noErr)
  53.         Debugger();
  54.         
  55.     myLevel.OnOff = 0;
  56.     myLevel.Level = 0;
  57.     err = SPBSetDeviceInfo (SoundRefNum,siTwosComplementOnOff, (Ptr) &myLevel);
  58.     if (err != noErr)
  59.         Debugger();
  60.         
  61.     err = SPBGetDeviceInfo (SoundRefNum,siSampleRate, (Ptr) &sampleRate);
  62.     if (err != noErr)
  63.         Debugger();
  64.         
  65.     RecordRec = (SPBPtr) NewPtr(sizeof (SPB));
  66.     if (MemError() != noErr || RecordRec == nil)
  67.         Debugger();
  68.  
  69.     Buffer = NewHandle(buffSize);
  70.     if (MemError() != noErr || Buffer == nil)
  71.         Debugger();
  72.     HLock (Buffer);
  73.  
  74.     err = SetupSndHeader (Buffer, 1, sampleRate, 8, 'NONE', 0x3C, 0, &headerlength);
  75.     if (err != noErr)
  76.         Debugger();
  77.     err = SetupSndHeader (Buffer, 1, sampleRate, 8, 'NONE', 0x3C, buffSize - headerlength, &dummy);
  78.     if (err != noErr)
  79.         Debugger();
  80.  
  81.     Buffer2 = NewHandle(buffSize);
  82.     if (MemError() != noErr || Buffer2 == nil)
  83.         Debugger();
  84.     HLock (Buffer2);
  85.  
  86.     err = SetupSndHeader (Buffer2, 1, sampleRate, 8, 'NONE', 0x3C, 0, &headerlength2);
  87.     if (err != noErr)
  88.         Debugger();
  89.         
  90.     err = SetupSndHeader (Buffer2, 1, sampleRate, 8, 'NONE', 0x3C, buffSize - headerlength2, &dummy);
  91.     if (err != noErr)
  92.         Debugger();
  93.         
  94.     /* create a SICompletionUPP */
  95.     mySICompletionUPP = NewSICompletionProc(MyRecComp);
  96.  
  97.     RecordRec->inRefNum = SoundRefNum;
  98.     RecordRec->count = 0;
  99.     RecordRec->milliseconds = 15000;
  100.     RecordRec->bufferLength = buffSize - headerlength;
  101.     RecordRec->bufferPtr = (Ptr) ((*Buffer) + headerlength);
  102.     RecordRec->completionRoutine = mySICompletionUPP;
  103.     RecordRec->interruptRoutine = nil;
  104.     RecordRec->userLong = 0;
  105.     RecordRec->error = 0;
  106.     RecordRec->unused1 = 0;
  107.  
  108.     chan = nil;
  109.     err = SndNewChannel (&chan, sampledSynth, 0, nil);
  110.     if (err != noErr)
  111.         Debugger();
  112.         
  113.     do {
  114.         err = SPBRecord (RecordRec, TRUE);
  115.         if (err != noErr)
  116.             Debugger();
  117.             
  118.         do {
  119.             } while (RecordRec->userLong == 0);
  120.         
  121.         if (RecordRec->userLong == 10) {
  122.             if (RecordRec->bufferPtr == (Ptr) ((*Buffer) + headerlength)) {
  123.                 RecordRec->bufferPtr = (Ptr) ((*Buffer2) + headerlength2);
  124.     
  125.                 err = SndPlay (chan, Buffer, TRUE);
  126.                 if (err != noErr)
  127.                     Debugger();
  128.                     
  129.                 }
  130.             else {
  131.                 RecordRec->bufferPtr = (Ptr) ((*Buffer) + headerlength);
  132.     
  133.                 err = SndPlay (chan, Buffer2, TRUE);
  134.                 if (err != noErr)
  135.                     Debugger();
  136.         
  137.                 }
  138.             RecordRec->userLong = 0;
  139.             } 
  140.         } while (RecordRec->userLong != 1);
  141.         
  142.     err = SndDisposeChannel (chan,FALSE);
  143.     if (err != noErr)
  144.         Debugger();
  145.  
  146.     SPBCloseDevice (SoundRefNum);
  147.         
  148.     HUnlock (Buffer);
  149.     HUnlock (Buffer2);
  150.     DisposeHandle (Buffer);
  151.     DisposeHandle (Buffer2);
  152.     DisposePtr ((Ptr) RecordRec);
  153.     
  154.     DisposeRoutineDescriptor(mySICompletionUPP);
  155. }
  156. /**********************************/
  157.  
  158. pascal void MyRecComp (SPBPtr inParamPtr)
  159. {
  160.     inParamPtr->userLong = 10;    
  161.     
  162.     if (Button())
  163.         inParamPtr->userLong = 1;    
  164.     
  165.     return;
  166. }
  167.  
  168. /**********************************/
  169.